移動平均線簡稱均線,是技術分析中一種,可以分析時間和股價數據之間關係的工具(技術分析的三種元素:價格、量能、時間;移動平均線是由股價與時間所組成的)。在這邊所談到的移動平均使用的是簡單移動平均,以收盤價的算數平均來計算平均價格。公式/範例:(今日收盤價+前4日收盤價) ÷5=5日均價。
使用移動平均可以讓短期波動平緩,降低誤差值干擾。而移動平均線也代表投資人的平均成本,且移動平均線是客觀的技術分析工具。
總共六條均線:使用看盤軟體的「內建參數」,不要去改它:
當移動平均線的角度越大,代表的多空力量越強,但維持時間通常越短。當天期和參數越長,因為加總的樣本數越多,移動均線會越平緩,反之則越多轉折。當天期和參數越長,均線與K線會距離越遠,碰觸的機會越少。
我們在Day4時就已經取得看盤軟體的移動平均線資料,因此我們很容易地在將它繪製於K線圖上。以下就是在K線圖上繪製20日移動平均線的程式碼:
# 設定K線格式
mc = mpf.make_marketcolors(up='xkcd:light red', down='xkcd:almost black', inherit=True)
s = mpf.make_mpf_style(base_mpf_style='yahoo', marketcolors=mc)
# 設定移動平均線
added_plots={
"SMA20": mpf.make_addplot(df_sma['SMA20'],width=0.6,color='xkcd:violet')
}
# 繪出K線圖
kwargs = dict(type='candle', style=s, figratio=(19,10), addplot=list(added_plots.values()))
mpf.plot(df_k_line,**kwargs)
其實這段程式與早先繪製K線圖的程式都是一樣的,因此相關說明請參閱Day5內容。程式執行結果如下所示:
另外我們還可以使用計算的方式來取得移動平均線,此處有兩種方式:第一種方式為使用DataFrame型態的rolling函式,第二種方式則是使用talib套件的SMA函式。首先使用第一種方式(DataFrame型態的rolling函式)計算移動平均線並將其繪製於K線圖上,程式碼如下所示:
# 使用DataFrame rolling方式計算20日移動平均
rolling_sma20 = df_k_line['Close'].rolling(window=20).mean()
print(rolling_sma20.values)
# 設定K線格式
mc = mpf.make_marketcolors(up='xkcd:light red', down='xkcd:almost black', inherit=True)
s = mpf.make_mpf_style(base_mpf_style='yahoo', marketcolors=mc)
# 設定移動平均線
added_plots={
"SMA20": mpf.make_addplot(rolling_sma20,width=0.6,color='xkcd:violet')
}
# 繪出K線圖
kwargs = dict(type='candle', style=s, figratio=(19,10), addplot=list(added_plots.values()))
mpf.plot(df_k_line,**kwargs)
程式執行結果如下所示:
從中可以發現計算出來的移動平均線少了前面幾天(準確來說是少了19天)。原因在於20日移動平均線的第一個有效的移動平均值需要有前面19天的收盤價才能計算,所以只要是在一個區間內計算移動平均線都會遇到相同的情況;稍後介紹的第二種方式也是如此。接下來使用第二種方式(talib套件的SMA函式)計算移動平均線並將其繪製於K線圖上,程式碼如下所示:
# 使用talib套件計算20日移動平均
talib_sma20 = SMA(df_k_line_talib,timeperiod=20)
print(talib_sma20.values)
# 設定K線格式
mc = mpf.make_marketcolors(up='xkcd:light red', down='xkcd:almost black', inherit=True)
s = mpf.make_mpf_style(base_mpf_style='yahoo', marketcolors=mc)
# 設定移動平均線
added_plots={
"SMA20": mpf.make_addplot(talib_sma20,width=0.6,color='xkcd:violet')
}
# 繪出K線圖
kwargs = dict(type='candle', style=s, figratio=(19,10), addplot=list(added_plots.values()))
mpf.plot(df_k_line,**kwargs)
程式執行結果如下所示:
從看盤軟體分別觀察短期移動平均線(兩條,分別為5日與10日)、中期移動平均線(兩條,分別為20日與60日)與長期移動平均線(兩條,分別為120與240日),可以得到很明確的短、中與長期的趨勢定義。當5日移動平均線與10日移動平均線的方向都為下(↓↓)時表示短期空頭。當20日移動平均線與60日移動平均線的方向都為下(↓↓)時表示中期空頭。當120日移動平均線與240日移動平均線的方向都為上(↑↑)時表示長期多頭。如下圖所示:
兩條移動平均線的判別趨勢方法如下:
↓↓:空頭,↑↑:多頭, ↑↓或↓↑:盤整
依據前面所描述的方式,寫一個函式以判斷多空趨勢。程式碼如下:
# 移動平均線趨勢判定程序
def moving_average_trend(sma):
now_sma = sma.iloc[-1].to_dict()
prev_sma = sma.iloc[-2].to_dict()
# 確認移動平均線方向:↑ : 'u' , ↓ : 'd' , = : '='
sma5_dir = 'u' if now_sma['SMA5'] > prev_sma['SMA5'] else 'd' if now_sma['SMA5'] < prev_sma['SMA5'] else '='
sma10_dir = 'u' if now_sma['SMA10'] > prev_sma['SMA10'] else 'd' if now_sma['SMA10'] < prev_sma['SMA10'] else '='
sma20_dir = 'u' if now_sma['SMA20'] > prev_sma['SMA20'] else 'd' if now_sma['SMA20'] < prev_sma['SMA20'] else '='
sma60_dir = 'u' if now_sma['SMA60'] > prev_sma['SMA60'] else 'd' if now_sma['SMA60'] < prev_sma['SMA60'] else '='
sma120_dir = 'u' if now_sma['SMA120'] > prev_sma['SMA120'] else 'd' if now_sma['SMA120'] < prev_sma['SMA120'] else '='
sma240_dir = 'u' if now_sma['SMA240'] > prev_sma['SMA240'] else 'd' if now_sma['SMA240'] < prev_sma['SMA240'] else '='
# 短期趨勢
if sma5_dir == sma10_dir :
if sma5_dir == 'u' :
print('短期趨勢:上升')
elif sma5_dir == 'd' :
print('短期趨勢:下降')
else :
print('短期趨勢:盤整')
# 中期趨勢
if sma20_dir == sma60_dir :
if sma20_dir == 'u' :
print('中期趨勢:上升')
elif sma20_dir == 'd' :
print('中期趨勢:下降')
else :
print('中期趨勢:盤整')
# 長期趨勢
if sma120_dir == sma240_dir :
if sma120_dir == 'u' :
print('長期趨勢:上升')
elif sma120_dir == 'd' :
print('長期趨勢:下降')
else :
print('長期趨勢:盤整')
利用上述函式判斷某日的短期、中期與長期的趨勢的程式碼於下所示:
# 2023年5月30日移動平均線趨勢判斷
moving_average_trend(df_sma)
詳細程式碼請參照「第七天:移動平均線.ipynb」。
可以利用移動平均穿越法則來尋找買賣點:
關於移動平均線買賣點的說明與程式實作,請參照Day21「葛蘭碧八大法則」內容。